import { createContext, useContext } from 'react';

/**
 * 菜单上下文属性接口，定义了菜单相关的状态和操作方法。
 *
 * @template T 路由泛型参数，默认为 unknown。
 */
export interface MixMenuContextProps<T = unknown> {
	/** 当前激活的一级菜单 key */
	activeFirstLevelMenuKey: string;
	/** 全部菜单数据列表 */
	allMenus: App.Global.Menu[];
	/** 当前激活一级菜单下的子菜单列表 */
	childLevelMenus: App.Global.Menu[];
	/** 一级菜单列表（不含 children 字段） */
	firstLevelMenu: App.Global.Menu[];
	/** 当前激活的一级菜单是否有子菜单 */
	isActiveFirstLevelMenuHasChildren: boolean;
	/** 当前路由对象 */
	route: Router.EnhancedRoute<T>;
	/** 当前选中的菜单 key 列表 */
	selectKey: string[];
	/** 设置激活的一级菜单 key 的方法 */
	setActiveFirstLevelMenuKey: (id?: string) => void;
}

/** 空函数占位，避免默认值报错。 */
function voidFunc() {}

/** 菜单上下文对象，提供全局菜单相关状态和操作。 */
export const MixMenuContext = createContext<MixMenuContextProps<unknown>>({
	activeFirstLevelMenuKey: '',
	allMenus: [],
	childLevelMenus: [],
	firstLevelMenu: [],
	isActiveFirstLevelMenuHasChildren: false,
	route: {} as Router.EnhancedRoute<unknown>,
	selectKey: [],
	setActiveFirstLevelMenuKey: voidFunc
});

/**
 * 获取菜单上下文的自定义 Hook，需在 MixMenuContext.Provider 内部使用。
 *
 * @template T 路由泛型参数，默认为 unknown。
 * @returns 菜单上下文对象
 * @throws 未在 Provider 内部调用时抛出错误。
 */
export function useMixMenuContext<T = unknown>() {
	const context = useContext(MixMenuContext);
	if (!context) {
		throw new Error('useMixMenuContext 必须在 MixMenuContext.Provider 内部使用');
	}
	return context as MixMenuContextProps<T>;
}
